package malagaAcoge.controller.beans;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import malagaAcoge.controller.daos.AbogadoDao;
import malagaAcoge.controller.daos.HistorialPenalDao;
import malagaAcoge.model.entities.Abogado;
import malagaAcoge.model.entities.Expediente;
import malagaAcoge.model.entities.Historialpenal;
import malagaAcoge.model.entities.Tecnico;
import malagaAcoge.model.entities.Usuario;

import org.primefaces.event.RowEditEvent;

public class HistorialPenalBean {
	private Usuario usuarioSelecionado;
	private Tecnico currentTecnico;
	private Date fechaIngresoPrision;
	private Date nuevafechaIngresoPrision;
	private Historialpenal historialPenal;
	private String nombreAbogado;
	private String nombreAbogadoNuevo;
	private Historialpenal historialAEliminar;
	private List<Historialpenal> historiales;

	public HistorialPenalBean() {
		setCurrentTecnico((Tecnico) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("tecnico"));
		setUsuarioSelecionado((Usuario) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("usuario"));
		historialPenal = new Historialpenal();
	}

	public void addHistorialPenal() {
		new AbogadoDao();
		Expediente expediente = getUsuarioSelecionado().getExpedientes().get(0);
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		historialPenal.setExpedienteBean(expediente);
		historialPenal.setFechaIngresoPrision(sdf.format(nuevafechaIngresoPrision));
		historialPenal.setAbogadoBean(AbogadoDao
				.findAbogadoByExactName(nombreAbogadoNuevo));
		new HistorialPenalDao();
		HistorialPenalDao.createHistorialpenal(historialPenal);
		if (expediente.getHistorialpenals() == null
				|| expediente.getHistorialpenals().isEmpty()) {
			getUsuarioSelecionado().getExpedientes().get(0)
					.setHistorialpenals(new ArrayList<Historialpenal>());
		}
		getUsuarioSelecionado().getExpedientes().get(0).getHistorialpenals()
				.add(historialPenal);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Datos penales registrados correctamente."));
		historiales = new ArrayList<Historialpenal>();
		historialPenal = new Historialpenal();
	}

	public void updateHistorialPenal(RowEditEvent event) {
		historialPenal = (Historialpenal) event.getObject();
		if (fechaIngresoPrision != null) {
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			historialPenal.setFechaIngresoPrision(sdf
					.format(fechaIngresoPrision));
		}
		if (nombreAbogado != null && !nombreAbogado.equals("")) {
			historialPenal.setAbogadoBean(AbogadoDao
					.findAbogadoByExactName(nombreAbogado));
		}
		int i = getUsuarioSelecionado().getExpedientes().get(0)
				.getHistorialpenals().indexOf(historialPenal);
		getUsuarioSelecionado().getExpedientes().get(0).getHistorialpenals()
				.set(i, historialPenal);
		new HistorialPenalDao();
		HistorialPenalDao.updateHistorialpenal(historialPenal);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Datos penales modificados correctamente."));
		historiales = new ArrayList<Historialpenal>();
	}

	public void eliminarHistorial() {
		historialAEliminar = (Historialpenal) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap()
				.remove("historialAEliminar");
		new HistorialPenalDao();
		HistorialPenalDao.deleteHistorialPenal(historialAEliminar
				.getIdHistorialPenal());
		getUsuarioSelecionado().getExpedientes().get(0).getHistorialpenals()
				.remove(historialAEliminar);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Datos penales eliminados."));
		historiales = new ArrayList<Historialpenal>();
	}

	public void setUsuarioSelecionado(Usuario usuarioSelecionado) {
		this.usuarioSelecionado = usuarioSelecionado;
	}

	public Usuario getUsuarioSelecionado() {
		return usuarioSelecionado;
	}

	public void setCurrentTecnico(Tecnico currentTecnico) {
		this.currentTecnico = currentTecnico;
	}

	public Tecnico getCurrentTecnico() {
		return currentTecnico;
	}

	public void setFechaIngresoPrision(Date fechaIngresoPrision) {
		this.fechaIngresoPrision = fechaIngresoPrision;
	}

	public Date getFechaIngresoPrision() {
		return fechaIngresoPrision;
	}

	public void setHistorialPenal(Historialpenal historialPenal) {
		this.historialPenal = historialPenal;
	}

	public Historialpenal getHistorialPenal() {
		return historialPenal;
	}

	// Autocomplete nombre de abogado
	public void setNombreAbogado(String nombreAbogado) {
		this.nombreAbogado = nombreAbogado;
	}

	public String getNombreAbogado() {
		return nombreAbogado;
	}

	public List<String> complete(String query) {
		new AbogadoDao();
		List<Abogado> abogados = AbogadoDao.findAbogadoByName(query);
		List<String> suggestions = new ArrayList<String>();
		for (Abogado abogado : abogados) {
			suggestions.add(abogado.getNombre() + " " + abogado.getApellidos());
		}
		return suggestions;
	}

	public String goToabogados() {
		return "abogados?faces-redirect=true";
	}

	// ////

	public void setHistorialAEliminar(Historialpenal historialAEliminar) {
		this.historialAEliminar = historialAEliminar;
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("historialAEliminar", historialAEliminar);
	}

	public Historialpenal getHistorialAEliminar() {
		return historialAEliminar;
	}

	public void setHistoriales(List<Historialpenal> historiales) {
		this.historiales = historiales;
	}

	public List<Historialpenal> getHistoriales() {
		if (historiales == null){
			historiales = new ArrayList<Historialpenal>();
		}
		if (historiales.isEmpty()&& getUsuarioSelecionado().getExpedientes() != null
				&& !getUsuarioSelecionado().getExpedientes().isEmpty()) {
			new HistorialPenalDao();
			historiales = HistorialPenalDao
					.findHistorialesByExpediente(getUsuarioSelecionado()
							.getExpedientes().get(0).getIdExpediente());
		}
		return historiales;
	}

	public void setNuevafechaIngresoPrision(Date nuevafechaIngresoPrision) {
		this.nuevafechaIngresoPrision = nuevafechaIngresoPrision;
	}

	public Date getNuevafechaIngresoPrision() {
		return nuevafechaIngresoPrision;
	}

	public void setNombreAbogadoNuevo(String nombreAbogadoNuevo) {
		this.nombreAbogadoNuevo = nombreAbogadoNuevo;
	}

	public String getNombreAbogadoNuevo() {
		return nombreAbogadoNuevo;
	}

}
